package main

import (
	"fmt"
)

//将函数进行类型定义
type myType func(int, int) int

//自定义数据类型
func main() {

	//给int取了别名，在go中myint和int是两个不同的类型
	//sdk1.9以后，应该属于类型定义，类型别名需要加上等号
	// type myint int

	//类型别名;加上等号后，int的别名就可以和其他int类型的变量进行赋值操作
	type myint = int

	var num myint = 100
	var num2 int = 100

	//如：赋值操作，类型定义（error）；类型别名可以
	num2 = num

	fmt.Println(num)
	fmt.Println(num2)

	//将函数进行类型定义
	fmt.Println(test2(3, test))

	fmt.Println(test3(1, 3))

	fmt.Println(test4(true, 1, 2, 3, 4, 5))

}

func test(n int, m int) int {
	return m + n
}

func test2(n int, funcvar myType) int {
	return funcvar(n, n)
}

//支持对函数返回值的命名
func test3(m int, n int) (sum int, sub int) {
	sum = m + n
	sub = m - n
	return
}

//如果要用可变参数，那么可变参数需要放在形参列表最后
func test4(n bool, args ...int) int {
	sum := 0
	if n {
		//len（args）：计算args的长度
		for i := 0; i < len(args); i++ {
			sum += args[i] //获取args切片的第一个元素值
		}
	}
	return sum
}

//函数形参列表可以省略类型
// func test5(n1,n2 int)int{
// 	return n1 + n2
// }
